﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using itau.im.relatorios.entidade;
using itau.im.relatorios.dado;
using EnterpriseLibraryWrapper;
using System.Data;

namespace itau.im.relatorios.negocio
{
    public class RelatorioRegraBS : IRelatorioRegraBS
    {
        public FiltroRelatorioRegras ObterFiltrosRelatorioRegras()
        {
            FiltroRelatorioRegras filtroRelatorioRegras = null;

            try
            {
                IRelatorioRegraDAO relatorioRegraDAO = DaoFactory.getRelatorioRegra();
                IRelatorioGrupoParametroDAO relatorioGrupoParametroDAO = DaoFactory.getRelatorioGrupoParametro();
                IRelatorioCurvaDAO relatorioCurvaDAO = DaoFactory.getRelatorioCurva();
                IRelatorioProdutoDAO relatorioProdutoDAO = DaoFactory.getRelatorioProduto();

                filtroRelatorioRegras = new FiltroRelatorioRegras();
                filtroRelatorioRegras.ListaGrupoParametro = new List<GrupoParametro>();
                filtroRelatorioRegras.ListaProdutoAlocacao = new List<ProdutoFinanceiroAlocacao>();
                filtroRelatorioRegras.ListaProdutoDerivado = new List<ProdutoFinanceiroDerivado>();
                filtroRelatorioRegras.ListaSituacao = new List<Situacao>();
                filtroRelatorioRegras.ListaSubMesasOperacao = new List<SubMesaOperacao>();
                filtroRelatorioRegras.ListaUsuarioAlteracao = new List<UsuarioAlteracao>();

                filtroRelatorioRegras.ListaSituacao.AddRange(relatorioRegraDAO.ObterSituacoesRegra());

                filtroRelatorioRegras.ListaSubMesasOperacao.AddRange(relatorioCurvaDAO.ObterSubMesas(1));

                filtroRelatorioRegras.ListaGrupoParametro.AddRange(relatorioGrupoParametroDAO.ObterGruposParametros());

                foreach (GrupoParametro grupo in filtroRelatorioRegras.ListaGrupoParametro)
                {
                    filtroRelatorioRegras.ListaProdutoAlocacao.AddRange(relatorioGrupoParametroDAO.ObterProdutoFinanceiroAlocacaoPorGrupoParametro(grupo.CodigoGrupoParametro));
                }

                IList<ProdutoFinanceiro> produtosFinanceiros = new List<ProdutoFinanceiro>();
                produtosFinanceiros = relatorioProdutoDAO.ObterProdutosFinanceiros();
                List<ProdutoFinanceiroDerivado> listaProdutoDerivado = new List<ProdutoFinanceiroDerivado>();
                foreach (ProdutoFinanceiro itemProduto in produtosFinanceiros)
                {
                    listaProdutoDerivado.AddRange(relatorioProdutoDAO.ObterProdutosDerivadosPorProduto(itemProduto.CodigoProdutoFinanceiro));
                }
                filtroRelatorioRegras.ListaProdutoDerivado = listaProdutoDerivado;

                //filtroRelatorioRegras.ListaUsuarioAlteracao.AddRange(relatorioRegraDAO.ObterUsuarios());

                return filtroRelatorioRegras;

            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }

            return null;
        }

        public IList<RelatorioParametrosERegrasSaida> ConsultarRelatorioParametrosERegra(RelatorioParametrosERegrasEntrada filtroRelatorio)
        {
            IRelatorioParametroDAO relatorioParametroDAO = null;
            IRelatorioProdutoDAO relatorioProdutoDAO = null;
            IRelatorioRegraDAO relatorioRegraDAO = null;
            IRelatorioGrupoParametroDAO relatorioGrupoParametroDAO = null;
            IRelatorioCurvaDAO relatorioCurvaDAO = null;

            IList<RelatorioParametrosERegrasSaida> relatorioParametrosERegrasSaida = null;

            IList<Curva> listaCurvas;
            IList<ParametroAtribuicao> listaParametros;

            try
            {
                relatorioParametrosERegrasSaida = new List<RelatorioParametrosERegrasSaida>();

                relatorioParametroDAO = DaoFactory.getRelatorioParametro();
                relatorioProdutoDAO = DaoFactory.getRelatorioProduto();
                relatorioRegraDAO = DaoFactory.getRelatorioRegra();
                relatorioGrupoParametroDAO = DaoFactory.getRelatorioGrupoParametro();
                relatorioCurvaDAO = DaoFactory.getRelatorioCurva();

                listaCurvas = relatorioCurvaDAO.ObterCurvas();
                listaParametros = relatorioParametroDAO.ObterParametros();

                foreach (GrupoParametro itemGrupo in filtroRelatorio.ListaGrupoParametro)
                {
                    IList<RegraAtribuicaoCurva> regrasPorGrupo = relatorioRegraDAO.ObterRegrasAtribuicaoCurvaPorCodigoGrupoData(itemGrupo.CodigoGrupoParametro, filtroRelatorio.DataInicioVigencia, filtroRelatorio.DataFimVigencia);
                    IList<DominioParametroAtribuicao> dominiosPorGrupo = relatorioParametroDAO.ObterDominiosParametrosAtribuicaoPorGrupoVigente(itemGrupo.CodigoGrupoParametro);
                    IList<ParametroAtribuicaoGrupoAlocacao> parametrosEndogenosPorGrupo = relatorioParametroDAO.ObterParametrosAtribuicaoGrupoAlocacaoPorGrupoParametrosVigente(itemGrupo.CodigoGrupoParametro);
                    IList<ProdutoFinanceiroDerivado> produtosExcecaoPorGrupo = relatorioProdutoDAO.ObterProdutosFinanceirosDerivadosExcecaoPorGrupoParametrosVigente(itemGrupo.CodigoGrupoParametro);

                    foreach (RegraAtribuicaoCurva itemRegra in regrasPorGrupo)
                    {
                        if (filtroRelatorio.ListaSituacao.Exists(p => p.codigo == itemRegra.CodigoSituacao))
                        {
                            RelatorioParametrosERegrasSaida novoItemRelatorio = new RelatorioParametrosERegrasSaida();
                            novoItemRelatorio.ListaParametros = new List<ParametroRelatorio>();

                            IList<ParametroRegra> parametrosPorRegra = relatorioParametroDAO.ObterParametroAtribuicaoPorRegraDataVigencia(itemRegra.CodigoRegraAtribuicaoCurva, itemRegra.DataInicioVigencia);
                            IEnumerable<ParametroRegra> parametrosExogenosPorRegra = parametrosPorRegra.Where(p => parametrosEndogenosPorGrupo.Count(q => q.CodigoParametroAtribuicao == p.CodigoParametroAtribuicao) == 0);

                            Curva primeiraCurva = listaCurvas.FirstOrDefault(p => p.CodigoCurva == itemRegra.CodigoCurvaPrimeira);
                            Curva primeiraCurvaCaixa = listaCurvas.FirstOrDefault(p => p.CodigoCurva == itemRegra.CodigoCurvaPrimeiraComCaixa);
                            Curva terceiraCurva = listaCurvas.FirstOrDefault(p => p.CodigoCurva == itemRegra.CodigoCurvaTerceira);
                            Curva terceiraCurvaCaixa = listaCurvas.FirstOrDefault(p => p.CodigoCurva == itemRegra.CodigoCurvaTerceiraComCaixa);
                            ProdutoFinanceiroDerivado produtoExcecao = produtosExcecaoPorGrupo.FirstOrDefault(p => p.CodigoProdutoFinanceiroDerivado == itemRegra.CodigoProdutoFinanceiroExcecao);

                            novoItemRelatorio.NomeCurva = primeiraCurva != null ? primeiraCurva.NomeCurva : string.Empty;
                            novoItemRelatorio.NomeCurvaComCaixa = primeiraCurvaCaixa != null ? primeiraCurvaCaixa.NomeCurva : string.Empty;
                            novoItemRelatorio.NomeTerceiraCurva = terceiraCurva != null ? terceiraCurva.NomeCurva : string.Empty;
                            novoItemRelatorio.NomeTerceiraCurvaComCaixa = terceiraCurva != null ? terceiraCurva.NomeCurva : string.Empty;
                            novoItemRelatorio.NomeGrupoParametro = itemGrupo.NomeGrupoParametro;
                            novoItemRelatorio.NomeProdutoExcecao = produtoExcecao != null ? produtoExcecao.NomeProdutoFinanceiroDerivado : string.Empty;
                            novoItemRelatorio.Situacao = itemRegra.CodigoSituacao == 1 ? "Habilitada" : "Desabilitada";
                            novoItemRelatorio.DataInicioVigencia = itemRegra.DataInicioVigencia;
                            novoItemRelatorio.DataFimVigencia = itemRegra.DataFimVigencia;

                            foreach (var itemEndogeno in parametrosEndogenosPorGrupo)
                            {
                                ParametroAtribuicao parametroCompleto = listaParametros.FirstOrDefault(p => p.CodigoParametroAtribuicao == itemEndogeno.CodigoParametroAtribuicao);

                                novoItemRelatorio.ListaParametros.AddRange(ObterParametroEndogeno(itemEndogeno, parametroCompleto, dominiosPorGrupo));
                            }

                            foreach (var itemExogeno in parametrosExogenosPorRegra)
                            {
                                ParametroAtribuicao parametroCompleto = listaParametros.FirstOrDefault(p => p.CodigoParametroAtribuicao == itemExogeno.CodigoParametroAtribuicao);

                                IList<DominioParametroAtribuicao> dominioPorParametro = relatorioParametroDAO.ObterRegistrosDominioParametro(itemExogeno.CodigoParametroAtribuicao);

                                novoItemRelatorio.ListaParametros.AddRange(ObterParametroExogeno(itemExogeno, parametroCompleto, dominioPorParametro));
                            }

                            relatorioParametrosERegrasSaida.Add(novoItemRelatorio);
                        }
                    }
                }

                return relatorioParametrosERegrasSaida;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }

            return null;
        }

        public IList<RelatorioCombinacoesDominioSaida> ConsultarRelatorioCombinacoesDominios(RelatorioCombinacoesDominioEntrada filtroRelatorio)
        {
            IRelatorioParametroDAO relatorioParametroDAO = null;
            IRelatorioProdutoDAO relatorioProdutoDAO = null;
            IRelatorioRegraDAO relatorioRegraDAO = null;
            IRelatorioGrupoParametroDAO relatorioGrupoParametroDAO = null;
            IRelatorioCurvaDAO relatorioCurvaDAO = null;

            IList<RelatorioCombinacoesDominioSaida> relatorioCombinacoesDominioSaida = null;

            IList<Curva> listaCurvas;
            IList<ParametroAtribuicao> listaParametros;

            try
            {
                relatorioCombinacoesDominioSaida = new List<RelatorioCombinacoesDominioSaida>();

                relatorioParametroDAO = DaoFactory.getRelatorioParametro();
                relatorioProdutoDAO = DaoFactory.getRelatorioProduto();
                relatorioRegraDAO = DaoFactory.getRelatorioRegra();
                relatorioGrupoParametroDAO = DaoFactory.getRelatorioGrupoParametro();
                relatorioCurvaDAO = DaoFactory.getRelatorioCurva();

                listaCurvas = relatorioCurvaDAO.ObterCurvas();
                listaParametros = relatorioParametroDAO.ObterParametros();

                foreach (GrupoParametro itemGrupo in filtroRelatorio.ListaGrupoParametro)
                {
                    IList<RegraAtribuicaoCurva> regrasPorGrupo = relatorioRegraDAO.ObterRegrasAtribuicaoCurvaPorCodigoGrupoData(itemGrupo.CodigoGrupoParametro, filtroRelatorio.DataInicioVigencia, filtroRelatorio.DataFimVigencia);
                    IList<DominioParametroAtribuicao> dominiosPorGrupo = relatorioParametroDAO.ObterDominiosParametrosAtribuicaoPorGrupoVigente(itemGrupo.CodigoGrupoParametro);
                    IList<ParametroAtribuicaoGrupoAlocacao> parametrosEndogenosPorGrupo = relatorioParametroDAO.ObterParametrosAtribuicaoGrupoAlocacaoPorGrupoParametrosVigente(itemGrupo.CodigoGrupoParametro);
                    IList<ProdutoFinanceiroDerivado> produtosExcecaoPorGrupo = relatorioProdutoDAO.ObterProdutosFinanceirosDerivadosExcecaoPorGrupoParametrosVigente(itemGrupo.CodigoGrupoParametro);

                    foreach (RegraAtribuicaoCurva itemRegra in regrasPorGrupo)
                    {
                        //Trata apenas as regras com SubProduto de Exceção listado no filtro SubProdutos
                        //if (filtroRelatorio.ListaProdutoAlocacao.Exists(p => p.CodigoProdutoFinanceiroDerivado == itemRegra.CodigoProdutoFinanceiroExcecao))
                        {
                            RelatorioCombinacoesDominioSaida novoItemRelatorio = new RelatorioCombinacoesDominioSaida();
                            novoItemRelatorio.ListaParametrosExogenos = new List<ParametroRelatorio>();
                            novoItemRelatorio.ListaParametrosEndogenos = new List<ParametroRelatorio>();

                            IList<ParametroRegra> parametrosPorRegra = relatorioParametroDAO.ObterParametroAtribuicaoPorRegraDataVigencia(itemRegra.CodigoRegraAtribuicaoCurva, itemRegra.DataInicioVigencia);
                            IEnumerable<ParametroRegra> parametrosExogenosPorRegra = parametrosPorRegra.Where(p => parametrosEndogenosPorGrupo.Count(q => q.CodigoParametroAtribuicao == p.CodigoParametroAtribuicao) == 0);

                            Curva primeiraCurva = listaCurvas.FirstOrDefault(p => p.CodigoCurva == itemRegra.CodigoCurvaPrimeira);
                            Curva primeiraCurvaCaixa = listaCurvas.FirstOrDefault(p => p.CodigoCurva == itemRegra.CodigoCurvaPrimeiraComCaixa);
                            Curva terceiraCurva = listaCurvas.FirstOrDefault(p => p.CodigoCurva == itemRegra.CodigoCurvaTerceira);
                            Curva terceiraCurvaCaixa = listaCurvas.FirstOrDefault(p => p.CodigoCurva == itemRegra.CodigoCurvaTerceiraComCaixa);
                            ProdutoFinanceiroDerivado produtoExcecao = produtosExcecaoPorGrupo.FirstOrDefault(p => p.CodigoProdutoFinanceiroDerivado == itemRegra.CodigoProdutoFinanceiroExcecao);

                            novoItemRelatorio.NomeCurva = primeiraCurva != null ? primeiraCurva.NomeCurva : string.Empty;
                            novoItemRelatorio.NomeCurvaComCaixa = primeiraCurvaCaixa != null ? primeiraCurvaCaixa.NomeCurva : string.Empty;
                            novoItemRelatorio.NomeTerceiraCurva = terceiraCurva != null ? terceiraCurva.NomeCurva : string.Empty;
                            novoItemRelatorio.NomeTerceiraCurvaComCaixa = terceiraCurva != null ? terceiraCurva.NomeCurva : string.Empty;
                            novoItemRelatorio.CodigoGrupoParametro = itemGrupo.CodigoGrupoParametro;
                            novoItemRelatorio.NomeGrupoParametro = itemGrupo.NomeGrupoParametro;
                            novoItemRelatorio.NomeProdutoExcecao = produtoExcecao != null ? produtoExcecao.NomeProdutoFinanceiroDerivado : string.Empty;
                            novoItemRelatorio.Situacao = itemRegra.CodigoSituacao == 1 ? "Habilitada" : "Desabilitada";
                            novoItemRelatorio.DataInicioVigencia = itemRegra.DataInicioVigencia;
                            novoItemRelatorio.DataFimVigencia = itemRegra.DataFimVigencia;
                            novoItemRelatorio.IndicadorExiste = "SIM";

                            foreach (var itemEndogeno in parametrosEndogenosPorGrupo)
                            {
                                ParametroAtribuicao parametroCompleto = listaParametros.FirstOrDefault(p => p.CodigoParametroAtribuicao == itemEndogeno.CodigoParametroAtribuicao);

                                novoItemRelatorio.ListaParametrosEndogenos.AddRange(ObterParametroEndogeno(itemEndogeno, parametroCompleto, dominiosPorGrupo));
                            }

                            foreach (var itemExogeno in parametrosExogenosPorRegra)
                            {
                                ParametroAtribuicao parametroCompleto = listaParametros.FirstOrDefault(p => p.CodigoParametroAtribuicao == itemExogeno.CodigoParametroAtribuicao);

                                IList<DominioParametroAtribuicao> dominioPorParametro = relatorioParametroDAO.ObterRegistrosDominioParametro(itemExogeno.CodigoParametroAtribuicao);

                                novoItemRelatorio.ListaParametrosExogenos.AddRange(ObterParametroExogeno(itemExogeno, parametroCompleto, dominioPorParametro));
                            }

                            relatorioCombinacoesDominioSaida.Add(novoItemRelatorio);
                        }
                    }
                }

                return relatorioCombinacoesDominioSaida;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }

            return null;
        }

        public IList<RelatorioHistAlteracaoRegrasSaida> ConsultarRelatorioHistoricoAlteracao(RelatorioHistAlteracaoRegrasEntrada filtroRelatorio)
        {
            IRelatorioParametroDAO relatorioParametroDAO = null;
            IRelatorioProdutoDAO relatorioProdutoDAO = null;
            IRelatorioRegraDAO relatorioRegraDAO = null;
            IRelatorioGrupoParametroDAO relatorioGrupoParametroDAO = null;
            IRelatorioCurvaDAO relatorioCurvaDAO = null;

            IList<RelatorioHistAlteracaoRegrasSaida> relatorioHistAlteracaoRegrasSaida = null;

            IList<Curva> listaCurvas;
            IList<ParametroAtribuicao> listaParametros;
            IList<GrupoParametro> listaGrupoParametro;

            try
            {
                relatorioHistAlteracaoRegrasSaida = new List<RelatorioHistAlteracaoRegrasSaida>();

                relatorioParametroDAO = DaoFactory.getRelatorioParametro();
                relatorioProdutoDAO = DaoFactory.getRelatorioProduto();
                relatorioRegraDAO = DaoFactory.getRelatorioRegra();
                relatorioGrupoParametroDAO = DaoFactory.getRelatorioGrupoParametro();
                relatorioCurvaDAO = DaoFactory.getRelatorioCurva();

                listaCurvas = relatorioCurvaDAO.ObterCurvas();
                listaParametros = relatorioParametroDAO.ObterParametros();
                listaGrupoParametro = relatorioGrupoParametroDAO.ObterGruposParametros();

                foreach (UsuarioAlteracao itemUsuario in filtroRelatorio.ListaUsuarioAlteracao)
                {
                    IList<RegraAtribuicaoCurva> regrasPorUsuario = relatorioRegraDAO.ObterRegrasAtribuicaoCurvaPorUsuarioEDataAlteracao(itemUsuario.codigo, filtroRelatorio.DataAlteracao);

                    var agrupamento = from grupo in regrasPorUsuario
                                      group grupo by grupo.CodigoGrupoParametroAtribuicao;

                    foreach (var item in agrupamento)
                    {
                        int codigoGrupoParametro = item.ToList()[0].CodigoGrupoParametroAtribuicao;
                        IList<DominioParametroAtribuicao> dominiosPorGrupo = relatorioParametroDAO.ObterDominiosParametrosAtribuicaoPorGrupoVigente(codigoGrupoParametro);
                        IList<ParametroAtribuicaoGrupoAlocacao> parametrosEndogenosPorGrupo = relatorioParametroDAO.ObterParametrosAtribuicaoGrupoAlocacaoPorGrupoParametrosVigente(codigoGrupoParametro);
                        IList<ProdutoFinanceiroDerivado> produtosExcecaoPorGrupo = relatorioProdutoDAO.ObterProdutosFinanceirosDerivadosExcecaoPorGrupoParametrosVigente(codigoGrupoParametro);

                        foreach (var itemRegra in item)
                        {
                            Curva primeiraCurva = listaCurvas.FirstOrDefault(p => p.CodigoCurva == itemRegra.CodigoCurvaPrimeira);
                            GrupoParametro grupoParametro = listaGrupoParametro.FirstOrDefault(p => p.CodigoGrupoParametro == itemRegra.CodigoGrupoParametroAtribuicao);
                            ProdutoFinanceiroDerivado produtoExcecao = produtosExcecaoPorGrupo.FirstOrDefault(p => p.CodigoProdutoFinanceiroDerivado == itemRegra.CodigoProdutoFinanceiroExcecao);

                            RelatorioHistAlteracaoRegrasSaida novoItemRelatorio = new RelatorioHistAlteracaoRegrasSaida();
                            novoItemRelatorio.ListaParametros = new List<ParametroRelatorio>();

                            IList<ParametroRegra> parametrosPorRegra = relatorioParametroDAO.ObterParametroAtribuicaoPorRegraDataVigencia(itemRegra.CodigoRegraAtribuicaoCurva, itemRegra.DataInicioVigencia);
                            IEnumerable<ParametroRegra> parametrosExogenosPorRegra = parametrosPorRegra.Where(p => parametrosEndogenosPorGrupo.Count(q => q.CodigoParametroAtribuicao == p.CodigoParametroAtribuicao) == 0);

                            novoItemRelatorio.NomeCurva = primeiraCurva != null ? primeiraCurva.NomeCurva : string.Empty;
                            novoItemRelatorio.NomeGrupoParametro = grupoParametro.NomeGrupoParametro;
                            novoItemRelatorio.NomeProdutoExcecao = produtoExcecao != null ? produtoExcecao.NomeProdutoFinanceiroDerivado : string.Empty;
                            
                            if (itemRegra.CodigoSituacao == 1)
                                novoItemRelatorio.Situacao = "Habilitada";
                            else if (itemRegra.CodigoSituacao == 2)
                                novoItemRelatorio.Situacao = "Desabilitada";
                            else
                                novoItemRelatorio.Situacao = string.Empty;

                            novoItemRelatorio.DataInicioVigencia = itemRegra.DataInicioVigencia;
                            novoItemRelatorio.DataFimVigencia = itemRegra.DataFimVigencia;

                            foreach (var itemEndogeno in parametrosEndogenosPorGrupo)
                            {
                                ParametroAtribuicao parametroCompleto = listaParametros.FirstOrDefault(p => p.CodigoParametroAtribuicao == itemEndogeno.CodigoParametroAtribuicao);

                                novoItemRelatorio.ListaParametros.AddRange(ObterParametroEndogeno(itemEndogeno, parametroCompleto, dominiosPorGrupo));
                            }

                            foreach (var itemExogeno in parametrosExogenosPorRegra)
                            {
                                ParametroAtribuicao parametroCompleto = listaParametros.FirstOrDefault(p => p.CodigoParametroAtribuicao == itemExogeno.CodigoParametroAtribuicao);

                                IList<DominioParametroAtribuicao> dominioPorParametro = relatorioParametroDAO.ObterRegistrosDominioParametro(itemExogeno.CodigoParametroAtribuicao);

                                novoItemRelatorio.ListaParametros.AddRange(ObterParametroExogeno(itemExogeno, parametroCompleto, dominioPorParametro));
                            }

                            relatorioHistAlteracaoRegrasSaida.Add(novoItemRelatorio);

                        }
                    }
                }

                return relatorioHistAlteracaoRegrasSaida;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }

            return null;
        }

        public IList<RelatorioListagemSubProdutosSaida> ConsultarRelatorioListagemSubProduto(RelatorioListagemSubProdutosEntrada filtroRelatorio)
        {
            IRelatorioParametroDAO relatorioParametroDAO = null;
            IRelatorioProdutoDAO relatorioProdutoDAO = null;
            IRelatorioRegraDAO relatorioRegraDAO = null;
            IRelatorioGrupoParametroDAO relatorioGrupoParametroDAO = null;
            IRelatorioCurvaDAO relatorioCurvaDAO = null;

            IList<RelatorioListagemSubProdutosSaida> relatorioListagemSubProdutosSaida = null;

            IList<Curva> listaCurvas;
            IList<ParametroAtribuicao> listaParametros;

            try
            {
                relatorioListagemSubProdutosSaida = new List<RelatorioListagemSubProdutosSaida>();

                relatorioParametroDAO = DaoFactory.getRelatorioParametro();
                relatorioProdutoDAO = DaoFactory.getRelatorioProduto();
                relatorioRegraDAO = DaoFactory.getRelatorioRegra();
                relatorioGrupoParametroDAO = DaoFactory.getRelatorioGrupoParametro();
                relatorioCurvaDAO = DaoFactory.getRelatorioCurva();

                listaCurvas = relatorioCurvaDAO.ObterCurvas();
                listaParametros = relatorioParametroDAO.ObterParametros();

                foreach (GrupoParametro itemGrupo in filtroRelatorio.ListaGrupoParametro)
                {
                    IList<RegraAtribuicaoCurva> regrasPorGrupo = relatorioRegraDAO.ObterRegrasAtribuicaoCurvaPorCodigoGrupoData(itemGrupo.CodigoGrupoParametro, filtroRelatorio.DataInicioVigencia, filtroRelatorio.DataFimVigencia);
                    IList<DominioParametroAtribuicao> dominiosPorGrupo = relatorioParametroDAO.ObterDominiosParametrosAtribuicaoPorGrupoVigente(itemGrupo.CodigoGrupoParametro);
                    IList<ParametroAtribuicaoGrupoAlocacao> parametrosEndogenosPorGrupo = relatorioParametroDAO.ObterParametrosAtribuicaoGrupoAlocacaoPorGrupoParametrosVigente(itemGrupo.CodigoGrupoParametro);
                    IList<ProdutoFinanceiroDerivado> produtosExcecaoPorGrupo = relatorioProdutoDAO.ObterProdutosFinanceirosDerivadosExcecaoPorGrupoParametrosVigente(itemGrupo.CodigoGrupoParametro);

                    foreach (RegraAtribuicaoCurva itemRegra in regrasPorGrupo)
                    {
                        //Trata apenas as regras com SubProduto de Exceção listado no filtro SubProdutos
                        //if (filtroRelatorio.ListaProdutoAlocacao.Exists(p => p.CodigoProdutoFinanceiroDerivado == itemRegra.CodigoProdutoFinanceiroExcecao))
                        {
                            RelatorioListagemSubProdutosSaida novoItemRelatorio = new RelatorioListagemSubProdutosSaida();
                            novoItemRelatorio.ListaParametros = new List<ParametroRelatorio>();

                            IList<ParametroRegra> parametrosPorRegra = relatorioParametroDAO.ObterParametroAtribuicaoPorRegraDataVigencia(itemRegra.CodigoRegraAtribuicaoCurva, itemRegra.DataInicioVigencia);
                            IEnumerable<ParametroRegra> parametrosExogenosPorRegra = parametrosPorRegra.Where(p => parametrosEndogenosPorGrupo.Count(q => q.CodigoParametroAtribuicao == p.CodigoParametroAtribuicao) == 0);

                            Curva primeiraCurva = listaCurvas.FirstOrDefault(p => p.CodigoCurva == itemRegra.CodigoCurvaPrimeira);
                            Curva primeiraCurvaCaixa = listaCurvas.FirstOrDefault(p => p.CodigoCurva == itemRegra.CodigoCurvaPrimeiraComCaixa);
                            Curva terceiraCurva = listaCurvas.FirstOrDefault(p => p.CodigoCurva == itemRegra.CodigoCurvaTerceira);
                            Curva terceiraCurvaCaixa = listaCurvas.FirstOrDefault(p => p.CodigoCurva == itemRegra.CodigoCurvaTerceiraComCaixa);
                            ProdutoFinanceiroDerivado produtoExcecao = produtosExcecaoPorGrupo.FirstOrDefault(p => p.CodigoProdutoFinanceiroDerivado == itemRegra.CodigoProdutoFinanceiroExcecao);

                            novoItemRelatorio.NomeCurva = primeiraCurva != null ? primeiraCurva.NomeCurva : string.Empty;
                            novoItemRelatorio.NomeCurvaComCaixa = primeiraCurvaCaixa != null ? primeiraCurvaCaixa.NomeCurva : string.Empty;
                            novoItemRelatorio.NomeTerceiraCurva = terceiraCurva != null ? terceiraCurva.NomeCurva : string.Empty;
                            novoItemRelatorio.NomeTerceiraCurvaComCaixa = terceiraCurva != null ? terceiraCurva.NomeCurva : string.Empty;
                            novoItemRelatorio.NomeGrupoParametro = itemGrupo.NomeGrupoParametro;
                            novoItemRelatorio.NomeProdutoExcecao = produtoExcecao != null ? produtoExcecao.NomeProdutoFinanceiroDerivado : string.Empty;
                            novoItemRelatorio.Situacao = itemRegra.CodigoSituacao == 1 ? "Habilitada" : "Desabilitada";
                            novoItemRelatorio.DataInicioVigencia = itemRegra.DataInicioVigencia;
                            novoItemRelatorio.DataFimVigencia = itemRegra.DataFimVigencia;

                            foreach (var itemEndogeno in parametrosEndogenosPorGrupo)
                            {
                                ParametroAtribuicao parametroCompleto = listaParametros.FirstOrDefault(p => p.CodigoParametroAtribuicao == itemEndogeno.CodigoParametroAtribuicao);

                                novoItemRelatorio.ListaParametros.AddRange(ObterParametroEndogeno(itemEndogeno, parametroCompleto, dominiosPorGrupo));
                            }

                            foreach (var itemExogeno in parametrosExogenosPorRegra)
                            {
                                ParametroAtribuicao parametroCompleto = listaParametros.FirstOrDefault(p => p.CodigoParametroAtribuicao == itemExogeno.CodigoParametroAtribuicao);

                                IList<DominioParametroAtribuicao> dominioPorParametro = relatorioParametroDAO.ObterRegistrosDominioParametro(itemExogeno.CodigoParametroAtribuicao);

                                novoItemRelatorio.ListaParametros.AddRange(ObterParametroExogeno(itemExogeno, parametroCompleto, dominioPorParametro));
                            }

                            relatorioListagemSubProdutosSaida.Add(novoItemRelatorio);
                        }
                    }
                }

                return relatorioListagemSubProdutosSaida;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }

            return null;
        }

        public IList<RelatorioRegraAprecamentoSaida> ConsultarRelatorioRegraAprecamento(RelatorioRegraAprecamentoEntrada filtroRelatorio)
        {
            IRelatorioParametroDAO relatorioParametroDAO = null;
            IRelatorioProdutoDAO relatorioProdutoDAO = null;
            IRelatorioRegraDAO relatorioRegraDAO = null;
            IRelatorioGrupoParametroDAO relatorioGrupoParametroDAO = null;
            IRelatorioCurvaDAO relatorioCurvaDAO = null;

            IList<RelatorioRegraAprecamentoSaida> relatorioRegraAprecamentoSaida = null;

            IList<Curva> listaCurvas;
            IList<ParametroAtribuicao> listaParametros;
            IList<SubMesaOperacao> listaMesaOrigem;

            try
            {
                relatorioRegraAprecamentoSaida = new List<RelatorioRegraAprecamentoSaida>();

                relatorioParametroDAO = DaoFactory.getRelatorioParametro();
                relatorioProdutoDAO = DaoFactory.getRelatorioProduto();
                relatorioRegraDAO = DaoFactory.getRelatorioRegra();
                relatorioGrupoParametroDAO = DaoFactory.getRelatorioGrupoParametro();
                relatorioCurvaDAO = DaoFactory.getRelatorioCurva();

                listaCurvas = relatorioCurvaDAO.ObterCurvas();
                listaParametros = relatorioParametroDAO.ObterParametros();
                listaMesaOrigem = relatorioCurvaDAO.ObterSubMesas(1);

                foreach (GrupoParametro itemGrupo in filtroRelatorio.ListaGrupoParametro)
                {
                    IList<RegraAtribuicaoCurva> regrasPorGrupo = relatorioRegraDAO.ObterRegrasAtribuicaoCurvaPorCodigoGrupoData(itemGrupo.CodigoGrupoParametro, filtroRelatorio.DataInicioVigencia, filtroRelatorio.DataFimVigencia);
                    IList<DominioParametroAtribuicao> dominiosPorGrupo = relatorioParametroDAO.ObterDominiosParametrosAtribuicaoPorGrupoVigente(itemGrupo.CodigoGrupoParametro);
                    IList<ParametroAtribuicaoGrupoAlocacao> parametrosEndogenosPorGrupo = relatorioParametroDAO.ObterParametrosAtribuicaoGrupoAlocacaoPorGrupoParametrosVigente(itemGrupo.CodigoGrupoParametro);
                    IList<ProdutoFinanceiroDerivado> produtosExcecaoPorGrupo = relatorioProdutoDAO.ObterProdutosFinanceirosDerivadosExcecaoPorGrupoParametrosVigente(itemGrupo.CodigoGrupoParametro);

                    foreach (RegraAtribuicaoCurva itemRegra in regrasPorGrupo)
                    {
                        RelatorioRegraAprecamentoSaida novoItemRelatorio = new RelatorioRegraAprecamentoSaida();
                        novoItemRelatorio.ListaParametros = new List<ParametroRelatorio>();
                        SubMesaOperacao mesaOrigemPrimeiraCurva = new SubMesaOperacao();
                        SubMesaOperacao mesaOrigemTerceiraCurva = new SubMesaOperacao();

                        IList<ParametroRegra> parametrosPorRegra = relatorioParametroDAO.ObterParametroAtribuicaoPorRegraDataVigencia(itemRegra.CodigoRegraAtribuicaoCurva, itemRegra.DataInicioVigencia);
                        IEnumerable<ParametroRegra> parametrosExogenosPorRegra = parametrosPorRegra.Where(p => parametrosEndogenosPorGrupo.Count(q => q.CodigoParametroAtribuicao == p.CodigoParametroAtribuicao) == 0);

                        Curva primeiraCurva = listaCurvas.FirstOrDefault(p => p.CodigoCurva == itemRegra.CodigoCurvaPrimeira);
                        if (primeiraCurva != null)
                            mesaOrigemPrimeiraCurva = listaMesaOrigem.FirstOrDefault(p => p.CodigoSubMesaOperacao == primeiraCurva.CodigoSubMesaOperacao);

                        Curva primeiraCurvaCaixa = listaCurvas.FirstOrDefault(p => p.CodigoCurva == itemRegra.CodigoCurvaPrimeiraComCaixa);

                        Curva terceiraCurva = listaCurvas.FirstOrDefault(p => p.CodigoCurva == itemRegra.CodigoCurvaTerceira);

                        if (terceiraCurva != null)
                            mesaOrigemTerceiraCurva = listaMesaOrigem.FirstOrDefault(p => p.CodigoSubMesaOperacao == terceiraCurva.CodigoSubMesaOperacao);

                        Curva terceiraCurvaCaixa = listaCurvas.FirstOrDefault(p => p.CodigoCurva == itemRegra.CodigoCurvaTerceiraComCaixa);

                        ProdutoFinanceiroDerivado produtoExcecao = produtosExcecaoPorGrupo.FirstOrDefault(p => p.CodigoProdutoFinanceiroDerivado == itemRegra.CodigoProdutoFinanceiroExcecao);

                        novoItemRelatorio.NomeCurva = primeiraCurva != null ? primeiraCurva.NomeCurva : string.Empty;

                        if (mesaOrigemPrimeiraCurva != null)
                            novoItemRelatorio.MesaOrigemCurva = mesaOrigemPrimeiraCurva.NomeSubMesaOperacao;

                        novoItemRelatorio.NomeCurvaComCaixa = primeiraCurvaCaixa != null ? primeiraCurvaCaixa.NomeCurva : string.Empty;
                        novoItemRelatorio.NomeTerceiraCurva = terceiraCurva != null ? terceiraCurva.NomeCurva : string.Empty;

                        if (mesaOrigemTerceiraCurva != null)
                            novoItemRelatorio.MesaOrigemTerceiraCurva = mesaOrigemTerceiraCurva.NomeSubMesaOperacao;

                        novoItemRelatorio.NomeTerceiraCurvaComCaixa = terceiraCurva != null ? terceiraCurva.NomeCurva : string.Empty;
                        novoItemRelatorio.NomeGrupoParametro = itemGrupo.NomeGrupoParametro;
                        novoItemRelatorio.NomeProdutoExcecao = produtoExcecao != null ? produtoExcecao.NomeProdutoFinanceiroDerivado : string.Empty;
                        novoItemRelatorio.Situacao = itemRegra.CodigoSituacao == 1 ? "Habilitada" : "Desabilitada";
                        novoItemRelatorio.DataInicioVigencia = itemRegra.DataInicioVigencia;
                        novoItemRelatorio.DataFimVigencia = itemRegra.DataFimVigencia;

                        foreach (var itemEndogeno in parametrosEndogenosPorGrupo)
                        {
                            ParametroAtribuicao parametroCompleto = listaParametros.FirstOrDefault(p => p.CodigoParametroAtribuicao == itemEndogeno.CodigoParametroAtribuicao);

                            novoItemRelatorio.ListaParametros.AddRange(ObterParametroEndogeno(itemEndogeno, parametroCompleto, dominiosPorGrupo));
                        }

                        foreach (var itemExogeno in parametrosExogenosPorRegra)
                        {
                            ParametroAtribuicao parametroCompleto = listaParametros.FirstOrDefault(p => p.CodigoParametroAtribuicao == itemExogeno.CodigoParametroAtribuicao);

                            IList<DominioParametroAtribuicao> dominioPorParametro = relatorioParametroDAO.ObterRegistrosDominioParametro(itemExogeno.CodigoParametroAtribuicao);

                            novoItemRelatorio.ListaParametros.AddRange(ObterParametroExogeno(itemExogeno, parametroCompleto, dominioPorParametro));
                        }

                        relatorioRegraAprecamentoSaida.Add(novoItemRelatorio);

                    }
                }

                return relatorioRegraAprecamentoSaida;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }

            return null;
        }

        public IList<RelatorioSegregacaoRegrasSaida> ConsultarRelatorioSegregacaoRegras(RelatorioSegregacaoRegrasEntrada filtroRelatorio)
        {
            IRelatorioParametroDAO relatorioParametroDAO = null;
            IRelatorioProdutoDAO relatorioProdutoDAO = null;
            IRelatorioRegraDAO relatorioRegraDAO = null;
            IRelatorioGrupoParametroDAO relatorioGrupoParametroDAO = null;
            IRelatorioCurvaDAO relatorioCurvaDAO = null;

            IList<RelatorioSegregacaoRegrasSaida> relatorioSegregacaoRegrasSaida = null;

            IList<Curva> listaCurvas;
            IList<ParametroAtribuicao> listaParametros;

            try
            {
                relatorioSegregacaoRegrasSaida = new List<RelatorioSegregacaoRegrasSaida>();

                relatorioParametroDAO = DaoFactory.getRelatorioParametro();
                relatorioProdutoDAO = DaoFactory.getRelatorioProduto();
                relatorioRegraDAO = DaoFactory.getRelatorioRegra();
                relatorioGrupoParametroDAO = DaoFactory.getRelatorioGrupoParametro();
                relatorioCurvaDAO = DaoFactory.getRelatorioCurva();

                listaCurvas = relatorioCurvaDAO.ObterCurvas();
                listaParametros = relatorioParametroDAO.ObterParametros();

                foreach (GrupoParametro itemGrupo in filtroRelatorio.ListaGrupoParametro)
                {
                    IList<RegraAtribuicaoCurva> regrasPorGrupo = relatorioRegraDAO.ObterRegrasAtribuicaoCurvaPorCodigoGrupoData(itemGrupo.CodigoGrupoParametro, filtroRelatorio.DataInicioVigencia, filtroRelatorio.DataFimVigencia);
                    IList<DominioParametroAtribuicao> dominiosPorGrupo = relatorioParametroDAO.ObterDominiosParametrosAtribuicaoPorGrupoVigente(itemGrupo.CodigoGrupoParametro);
                    IList<ParametroAtribuicaoGrupoAlocacao> parametrosEndogenosPorGrupo = relatorioParametroDAO.ObterParametrosAtribuicaoGrupoAlocacaoPorGrupoParametrosVigente(itemGrupo.CodigoGrupoParametro);
                    IList<ProdutoFinanceiroDerivado> produtosExcecaoPorGrupo = relatorioProdutoDAO.ObterProdutosFinanceirosDerivadosExcecaoPorGrupoParametrosVigente(itemGrupo.CodigoGrupoParametro);

                    foreach (RegraAtribuicaoCurva itemRegra in regrasPorGrupo)
                    {
                        Curva primeiraCurva = listaCurvas.FirstOrDefault(p => p.CodigoCurva == itemRegra.CodigoCurvaPrimeira);
                        if (primeiraCurva != null && filtroRelatorio.ListaMesaOrigem.Exists(p => p.CodigoSubMesaOperacao == primeiraCurva.CodigoSubMesaOperacao))
                        {
                            RelatorioSegregacaoRegrasSaida novoItemRelatorio = new RelatorioSegregacaoRegrasSaida();
                            novoItemRelatorio.ListaParametros = new List<ParametroRelatorio>();

                            IList<ParametroRegra> parametrosPorRegra = relatorioParametroDAO.ObterParametroAtribuicaoPorRegraDataVigencia(itemRegra.CodigoRegraAtribuicaoCurva, itemRegra.DataInicioVigencia);
                            IEnumerable<ParametroRegra> parametrosExogenosPorRegra = parametrosPorRegra.Where(p => parametrosEndogenosPorGrupo.Count(q => q.CodigoParametroAtribuicao == p.CodigoParametroAtribuicao) == 0);

                            Curva primeiraCurvaCaixa = listaCurvas.FirstOrDefault(p => p.CodigoCurva == itemRegra.CodigoCurvaPrimeiraComCaixa);
                            Curva terceiraCurva = listaCurvas.FirstOrDefault(p => p.CodigoCurva == itemRegra.CodigoCurvaTerceira);
                            Curva terceiraCurvaCaixa = listaCurvas.FirstOrDefault(p => p.CodigoCurva == itemRegra.CodigoCurvaTerceiraComCaixa);
                            ProdutoFinanceiroDerivado produtoExcecao = produtosExcecaoPorGrupo.FirstOrDefault(p => p.CodigoProdutoFinanceiroDerivado == itemRegra.CodigoProdutoFinanceiroExcecao);

                            novoItemRelatorio.NomeMesaOrigem1Curva = filtroRelatorio.ListaMesaOrigem.FirstOrDefault(p => p.CodigoSubMesaOperacao == primeiraCurva.CodigoSubMesaOperacao).NomeSubMesaOperacao;
                            novoItemRelatorio.NomeCurva = primeiraCurva != null ? primeiraCurva.NomeCurva : string.Empty;
                            novoItemRelatorio.NomeCurvaComCaixa = primeiraCurvaCaixa != null ? primeiraCurvaCaixa.NomeCurva : string.Empty;
                            novoItemRelatorio.NomeTerceiraCurva = terceiraCurva != null ? terceiraCurva.NomeCurva : string.Empty;
                            novoItemRelatorio.NomeTerceiraCurvaComCaixa = terceiraCurva != null ? terceiraCurva.NomeCurva : string.Empty;
                            novoItemRelatorio.NomeGrupoParametro = itemGrupo.NomeGrupoParametro;
                            novoItemRelatorio.NomeProdutoExcecao = produtoExcecao != null ? produtoExcecao.NomeProdutoFinanceiroDerivado : string.Empty;
                            novoItemRelatorio.Situacao = itemRegra.CodigoSituacao == 1 ? "Habilitada" : "Desabilitada";
                            novoItemRelatorio.DataInicioVigencia = itemRegra.DataInicioVigencia;
                            novoItemRelatorio.DataFimVigencia = itemRegra.DataFimVigencia;

                            foreach (var itemEndogeno in parametrosEndogenosPorGrupo)
                            {
                                ParametroAtribuicao parametroCompleto = listaParametros.FirstOrDefault(p => p.CodigoParametroAtribuicao == itemEndogeno.CodigoParametroAtribuicao);

                                novoItemRelatorio.ListaParametros.AddRange(ObterParametroEndogeno(itemEndogeno, parametroCompleto, dominiosPorGrupo));
                            }

                            foreach (var itemExogeno in parametrosExogenosPorRegra)
                            {
                                ParametroAtribuicao parametroCompleto = listaParametros.FirstOrDefault(p => p.CodigoParametroAtribuicao == itemExogeno.CodigoParametroAtribuicao);

                                IList<DominioParametroAtribuicao> dominioPorParametro = relatorioParametroDAO.ObterRegistrosDominioParametro(itemExogeno.CodigoParametroAtribuicao);

                                novoItemRelatorio.ListaParametros.AddRange(ObterParametroExogeno(itemExogeno, parametroCompleto, dominioPorParametro));
                            }

                            relatorioSegregacaoRegrasSaida.Add(novoItemRelatorio);
                        }
                    }
                }

                return relatorioSegregacaoRegrasSaida;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }

            return null;
        }

        private IList<ParametroRelatorio> ObterParametroEndogeno(ParametroAtribuicaoGrupoAlocacao parametroAlocado, ParametroAtribuicao parametroCompleto, IList<DominioParametroAtribuicao> dominios)
        {
            IList<ParametroRelatorio> parametroRelatorio = new List<ParametroRelatorio>();

            if (parametroAlocado != null && parametroCompleto != null)
            {
                if (parametroAlocado.CodigoDominioParametroAtribuicao != 0)
                {
                    DominioParametroAtribuicao dominioDefinido = dominios.FirstOrDefault(p => p.CodigoDominioParametroAtribuicao == parametroAlocado.CodigoDominioParametroAtribuicao);

                    if (dominioDefinido != null)
                    {
                        parametroRelatorio.Add(new ParametroRelatorio()
                        {
                            CodigoDominio = dominioDefinido.CodigoDominioParametroAtribuicao,
                            CodigoParametro = dominioDefinido.CodigoParametroAtribuicao,
                            Valor = dominioDefinido.TextoValorDominioParametro,
                            NomeParametro = parametroCompleto.NomeParametroAtribuicao
                        });
                    }
                }
                else
                {
                    if (string.IsNullOrEmpty(parametroAlocado.TextoValorAtribuicaoFim) &&
                        string.IsNullOrEmpty(parametroAlocado.TextoValorAtribuicaoFim.Trim())) //Parâmetro sem range
                    {
                        parametroRelatorio.Add(new ParametroRelatorio()
                        {
                            Valor = parametroAlocado.TextoValorParametroAtribuicao,
                            NomeParametro = parametroCompleto.NomeParametroAtribuicao
                        });
                    }
                    else //Parâmetro com range
                    {
                        parametroRelatorio.Add(new ParametroRelatorio()
                        {
                            Valor = parametroAlocado.TextoValorParametroAtribuicao,
                            NomeParametro = string.Concat(parametroCompleto.NomeParametroAtribuicao, " - ", "Início")
                        });

                        parametroRelatorio.Add(new ParametroRelatorio()
                        {
                            Valor = parametroAlocado.TextoValorAtribuicaoFim,
                            NomeParametro = string.Concat(parametroCompleto.NomeParametroAtribuicao, " - ", "Fim")
                        });
                    }
                }
            }

            return parametroRelatorio;
        }

        private IList<ParametroRelatorio> ObterParametroExogeno(ParametroRegra parametroAlocado, ParametroAtribuicao parametroCompleto, IList<DominioParametroAtribuicao> dominios)
        {
            IList<ParametroRelatorio> parametroRelatorio = new List<ParametroRelatorio>();

            if (parametroAlocado != null && parametroCompleto != null)
            {
                if (parametroAlocado.CodigoDominioParametroAtribuicao != 0)
                {
                    DominioParametroAtribuicao dominioSelecionado = dominios.FirstOrDefault(
                        p => p.CodigoDominioParametroAtribuicao == parametroAlocado.CodigoDominioParametroAtribuicao);

                    parametroRelatorio.Add(new ParametroRelatorio()
                    {
                        CodigoDominio = dominioSelecionado.CodigoDominioParametroAtribuicao,
                        CodigoParametro = parametroCompleto.CodigoParametroAtribuicao,
                        Valor = dominioSelecionado.TextoValorDominioParametro,
                        NomeParametro = parametroCompleto.NomeParametroAtribuicao,
                    });
                }
                else
                {
                    if (string.IsNullOrEmpty(parametroAlocado.TextoValorInternoFim) &&
                        string.IsNullOrEmpty(parametroAlocado.TextoValorInternoFim.Trim())) //Parâmetro sem range
                    {
                        parametroRelatorio.Add(new ParametroRelatorio()
                        {
                            Valor = parametroAlocado.TextoValorInterno,
                            NomeParametro = parametroCompleto.NomeParametroAtribuicao,
                            CodigoParametro = parametroCompleto.CodigoParametroAtribuicao
                        });
                    }
                    else //Parâmetro com range
                    {
                        parametroRelatorio.Add(new ParametroRelatorio()
                        {
                            Valor = parametroAlocado.TextoValorInterno,
                            NomeParametro = string.Concat(parametroCompleto.NomeParametroAtribuicao, " - ", "Início"),
                            CodigoParametro = parametroCompleto.CodigoParametroAtribuicao,
                        });

                        parametroRelatorio.Add(new ParametroRelatorio()
                        {
                            Valor = parametroAlocado.TextoValorInternoFim,
                            NomeParametro = string.Concat(parametroCompleto.NomeParametroAtribuicao, " - ", "Fim"),
                            CodigoParametro = parametroCompleto.CodigoParametroAtribuicao
                        });
                    }
                }
            }

            return parametroRelatorio;
        }
    }
}
